Contents
  1. 1. 题目:
  2. 2. 程序输入:
  3. 3. 程序输出:
  4. 4. 例如:
    1. 4.1. 输入:
    2. 4.2. 则应输出:
    3. 4.3. 输入:
    4. 4.4. 则应输出:

题目:

  公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别
为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。

程序输入:

第一行是一个整数m,代表可购买的商品的种类数。

接下来是m个整数,每个1行,分别代表这m种商品的单价。

程序输出:

第一行是一个整数,表示共有多少种方案

第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。

例如:

输入:

2
200
300

则应输出:

2
2 2
5 0

输入:

2
500
800

则应输出:

1
2 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62


#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
using namespace std;

int price[110]; //商品价格
int num[110]; //商品数
int sum = 1; //方案数
int arg[110][110];
int cost;
int n; //物品个数

void init()
{

memset(price, 0, sizeof(price));
memset(num, 0, sizeof(num));
memset(arg, 0, sizeof(arg));
}

void solve(int x)
{

int i;
if(cost > 1000 || x >n )
return ;
if(cost == 1000){
for(i = 1; i <= n; i++){
arg[sum][i] = num[i]; //第sum个方案里的物品个数
}
sum++; //进入下一个方案
return ;
}
num[x]++; //选择了这件商品
cost += price[x];
solve(x); //继续选择这件商品
num[x]--; //不选择这件商品
cost -= price[x];
fun(x + 1); //选择下一件商品
}

int main()
{

int i, j;
scanf("%d", &n);
init();
for(i = 1; i <= n; i++){
scanf("%d", &price[i]);
}
solve(1);
printf("%d\n", sum - 1);
for(i = 1; i < sum; i++){
for(j = 1; j <= n; j++){
printf("%d ", arg[i][j]);
}
printf("\n");
}

return 0;
}
Contents
  1. 1. 题目:
  2. 2. 程序输入:
  3. 3. 程序输出:
  4. 4. 例如:
    1. 4.1. 输入:
    2. 4.2. 则应输出:
    3. 4.3. 输入:
    4. 4.4. 则应输出: